package com.zelin.page.service.impl;

import com.alibaba.fastjson.JSON;
import com.alipay.api.AlipayApiException;
import com.alipay.api.internal.util.AlipaySignature;
import com.zelin.page.client.OrderClient;
import com.zelin.page.service.PayService;
import com.zyg.common.entity.PayAsyncVo;
import com.zyg.common.entity.TbPayLog;
import com.zyg.common.utils.AlipayTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.Map;

/**
 * ------------------------------
 * 功能：
 * 作者：WF
 * 微信：hbxfwf13590332912
 * 创建时间：2021/11/19-16:37
 * ------------------------------
 */
@Service
public class PayServiceImpl implements PayService {
    @Autowired
    private AlipayTemplate alipayTemplate;
    @Autowired
    private OrderClient orderClient;
    //1. 支付宝后台发送的异步响应
    @Override
    public String payNotify(PayAsyncVo vo, Map<String, String> params) throws AlipayApiException {
        //1. 进行验签
        boolean signVerified = AlipaySignature.rsaCheckV1(params, alipayTemplate.getAlipay_public_key(),
                alipayTemplate.getCharset(), alipayTemplate.getSign_type()); //调用SDK验证签名
        //2. 如果验签通过,① 修改支付日志 ② 修改订单
        if(signVerified){
            //2.1 得到订单号
            String out_trade_no = vo.getOut_trade_no();
            //2.2 根据订单id查询支付日志
            TbPayLog payLog = orderClient.findPayLog(out_trade_no);
            System.out.println("payLog = " + payLog);

            // //2.3 修改支付日志
             payLog.setTransactionId(vo.getTrade_no());
             payLog.setTradeState("1");         //己支付
             payLog.setPayTime(new Date());     //支付时间
            //2.4 修改支付日志
            orderClient.updatePayLog(payLog);

            //2.5 判断支付状态是否成功或完成
            if(vo.getTrade_status().equals("TRADE_FINISHED") || vo.getTrade_status().equals("TRADE_SUCCESS")){
                //2.5.1 得到支付日志中订单列表
                String orderList = payLog.getOrderList();
                // 2.5.2 遍历，得到每个订单id
                for (String id : orderList.split(",")) {
                    orderClient.updateOrder(id);
                }

            }
            System.out.println("支付成功");
            return "success";
        }

        return "fail";
    }
}
